<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>后端学习记录 - 随时随地记录知识</title><meta name="author" content="h0ss"><meta name="copyright" content="h0ss"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="h0ss的后端学习记录">
<meta property="og:type" content="website">
<meta property="og:title" content="后端学习记录">
<meta property="og:url" content="https://blog.gpnusz.cn/page/3/index.html">
<meta property="og:site_name" content="后端学习记录">
<meta property="og:description" content="h0ss的后端学习记录">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://blog.gpnusz.cn/img/avatar.jpg">
<meta property="article:author" content="h0ss">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://blog.gpnusz.cn/img/avatar.jpg"><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="https://blog.gpnusz.cn/page/3/"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = { 
  root: '/',
  algolia: undefined,
  localSearch: undefined,
  translate: undefined,
  noticeOutdate: undefined,
  highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
  copy: {
    success: '复制成功',
    error: '复制错误',
    noSupport: '浏览器不支持'
  },
  relativeDate: {
    homepage: false,
    post: false
  },
  runtime: '天',
  date_suffix: {
    just: '刚刚',
    min: '分钟前',
    hour: '小时前',
    day: '天前',
    month: '个月前'
  },
  copyright: undefined,
  lightbox: 'fancybox',
  Snackbar: undefined,
  source: {
    jQuery: 'https://cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js',
    justifiedGallery: {
      js: 'https://cdn.jsdelivr.net/npm/justifiedGallery/dist/js/jquery.justifiedGallery.min.js',
      css: 'https://cdn.jsdelivr.net/npm/justifiedGallery/dist/css/justifiedGallery.min.css'
    },
    fancybox: {
      js: 'https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.js',
      css: 'https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.css'
    }
  },
  isPhotoFigcaption: false,
  islazyload: false,
  isanchor: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = { 
  isPost: false,
  isHome: true,
  isHighlightShrink: false,
  isToc: false,
  postUpdate: '2022-11-16 01:31:32'
}</script><noscript><style type="text/css">
  #nav {
    opacity: 1
  }
  .justified-gallery img {
    opacity: 1
  }

  #recent-posts time,
  #post-meta time {
    display: inline !important
  }
</style></noscript><script>(win=>{
    win.saveToLocal = {
      set: function setWithExpiry(key, value, ttl) {
        if (ttl === 0) return
        const now = new Date()
        const expiryDay = ttl * 86400000
        const item = {
          value: value,
          expiry: now.getTime() + expiryDay,
        }
        localStorage.setItem(key, JSON.stringify(item))
      },

      get: function getWithExpiry(key) {
        const itemStr = localStorage.getItem(key)

        if (!itemStr) {
          return undefined
        }
        const item = JSON.parse(itemStr)
        const now = new Date()

        if (now.getTime() > item.expiry) {
          localStorage.removeItem(key)
          return undefined
        }
        return item.value
      }
    }
  
    win.getScript = url => new Promise((resolve, reject) => {
      const script = document.createElement('script')
      script.src = url
      script.async = true
      script.onerror = reject
      script.onload = script.onreadystatechange = function() {
        const loadState = this.readyState
        if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
        script.onload = script.onreadystatechange = null
        resolve()
      }
      document.head.appendChild(script)
    })
  
      win.activateDarkMode = function () {
        document.documentElement.setAttribute('data-theme', 'dark')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
        }
      }
      win.activateLightMode = function () {
        document.documentElement.setAttribute('data-theme', 'light')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
        }
      }
      const t = saveToLocal.get('theme')
    
          if (t === 'dark') activateDarkMode()
          else if (t === 'light') activateLightMode()
        
      const asideStatus = saveToLocal.get('aside-status')
      if (asideStatus !== undefined) {
        if (asideStatus === 'hide') {
          document.documentElement.classList.add('hide-aside')
        } else {
          document.documentElement.classList.remove('hide-aside')
        }
      }
    })(window)</script><meta name="generator" content="Hexo 5.4.0"><link rel="stylesheet" href="/css/prism-tomorrow.css" type="text/css"></head><body><div id="web_bg"></div><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="author-avatar"><img class="avatar-img" src="/img/avatar.jpg" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="site-data"><div class="data-item is-center"><div class="data-item-link"><a href="/archives/"><div class="headline">文章</div><div class="length-num">51</div></a></div></div><div class="data-item is-center"><div class="data-item-link"><a href="/tags/"><div class="headline">标签</div><div class="length-num">14</div></a></div></div></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div></div></div><div class="page" id="body-wrap"><header class="not-top-img" id="page-header"><nav id="nav"><span id="blog_name"><a id="site-name" href="/">后端学习记录</a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div><div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div></div></nav></header><main class="layout" id="content-inner"><div class="recent-posts" id="recent-posts"><div class="recent-post-item"><div class="post_cover left_radius"><a href="/2022/02/08/JVM-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-1-%EF%BC%9AJava%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F/" title="JVM 学习笔记(1)：Java内存区域">     <img class="post_bg" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/704abf3f763a4c05993f717f94113fcf~tplv-k3u1fbpfcp-watermark.image" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="JVM 学习笔记(1)：Java内存区域"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/02/08/JVM-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-1-%EF%BC%9AJava%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F/" title="JVM 学习笔记(1)：Java内存区域">JVM 学习笔记(1)：Java内存区域</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-02-08T10:01:49.000Z" title="发表于 2022-02-08 18:01:49">2022-02-08</time></span></div><div class="content">1、运行时数据区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途，以及创建和销毁的时间，有的区域随着虚拟机进程的启动而一直存在，有些区域则是 依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》的规定，Java虚拟机所管理的内存将会包括以下几个运行时数据区域。 –《深入理解Java虚拟机》


2、程序计数器1）定义程序计数器是一块较小的内存空间，可以看做是当前线程所执行的字节码的行号指示器 ，也就是记录下 Java 程序当前指令的地址偏移量，可在线程切换时记录下当前线程执行的位置，给 CPU 提供指令地址，以便下一次切换回来找到继续执行的位置。
2）特点① 线程私有的：它需要记录当前指令地址偏移量，在线程切换时如果不是每个线程都有一个计数器，将无法区分/辨认不同线程的指令执行地址；
② 随着线程的开始而产生，随着线程的结束而消亡：在线程开始执行到结束的区间，会失去 CPU 的执行权，因此必须在线程开始时就创建该计数器； 
③  JVM 规范中唯一一个没有规范内存溢出 (OutOfMemoryError) 的区域 ...</div></div></div><div class="recent-post-item"><div class="post_cover right_radius"><a href="/2022/02/03/Redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-1-%EF%BC%9A%E5%AF%B9%E8%B1%A1%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE/" title="Redis学习笔记(1)：对象思维导图">     <img class="post_bg" src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2e7f7d325fbb4deb8f52e98a897bf5ca~tplv-k3u1fbpfcp-watermark.image" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Redis学习笔记(1)：对象思维导图"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/02/03/Redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-1-%EF%BC%9A%E5%AF%B9%E8%B1%A1%E6%80%9D%E7%BB%B4%E5%AF%BC%E5%9B%BE/" title="Redis学习笔记(1)：对象思维导图">Redis学习笔记(1)：对象思维导图</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-02-02T19:10:34.000Z" title="发表于 2022-02-03 03:10:34">2022-02-03</time></span></div><div class="content">学习完《Redis设计与实现》对象章节后的思维导图

</div></div></div><div class="recent-post-item"><div class="post_cover left_radius"><a href="/2022/01/21/%E3%80%90%E5%8A%9B%E6%89%A3%E9%A2%98%E8%A7%A3%E3%80%91%E7%9F%B3%E5%AD%90%E6%B8%B8%E6%88%8F-IX/" title="【力扣题解】石子游戏 IX">     <img class="post_bg" src="https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1af54aa0fd9f4eb6bc6f38efbd2afcc7~tplv-k3u1fbpfcp-watermark.image" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="【力扣题解】石子游戏 IX"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/01/21/%E3%80%90%E5%8A%9B%E6%89%A3%E9%A2%98%E8%A7%A3%E3%80%91%E7%9F%B3%E5%AD%90%E6%B8%B8%E6%88%8F-IX/" title="【力扣题解】石子游戏 IX">【力扣题解】石子游戏 IX</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-01-21T07:33:18.000Z" title="发表于 2022-01-21 15:33:18">2022-01-21</time></span></div><div class="content">1、题目
本题解主要思路取自官方题解，记录下学习过程

Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子，每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ，其中 stones[i] 是第 i 个石子的价值。
Alice 和 Bob 轮流进行自己的回合，Alice 先手。每一回合，玩家需要从 stones 中移除任一石子，规则如下：

如果玩家移除石子后，导致 所有已移除石子 的价值 总和 可以被 3 整除，那么该玩家就 输掉游戏 。
如果不满足上一条，且移除后没有任何剩余的石子，那么 Bob 将会直接获胜（即便是在 Alice 的回合）。

假设两位玩家均采用 最佳 决策。如果 Alice 获胜，返回 true ；如果 Bob 获胜，返回 false 。
题目示例：


2、题解Step1 石子分类根据题意石子分三类，数量余3为0的称为类型0，余3为1的称为类型1，余3为2的称为类型2。
由于在题目规则上进行游戏时需要保证移除石子和不整除3，因此类型0的选取实际上是对总量无影响的，但是如果类型0出现次数为奇数，回合会交换；如果为偶数则回合 ...</div></div></div><div class="recent-post-item"><div class="post_cover right_radius"><a href="/2021/08/06/Mybatis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" title="Mybatis学习笔记">     <img class="post_bg" src="https://www.hualigs.cn/image/610c1f94eb0a8.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Mybatis学习笔记"></a></div><div class="recent-post-info"><a class="article-title" href="/2021/08/06/Mybatis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" title="Mybatis学习笔记">Mybatis学习笔记</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2021-08-05T17:13:37.000Z" title="发表于 2021-08-06 01:13:37">2021-08-06</time></span></div><div class="content">1、概述MyBatis 是一款优秀的持久层框架，它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO（Plain Old Java Objects，普通老式 Java 对象）为数据库中的记录【官方文档】。
Mybatis与其他的ORM框架不同，不是将对象与数据库表联系起来，而是将Java方法与SQL语句相关联。相比 Hibernate (全自动ORM框架)，Mybatis属于是半自动ORM，在Mybatis上进行SQL优化/SQL语句修改等操作会比较简单，在Hibernate上还需要转换为HQL语言。
2、简单配置1）环境准备使用maven进行依赖管理的项目中，只需要引入mybatis的坐标（以及mysql相关），这里以mybatis 3.5.7为例：
12345678910&lt;dependency&gt;	&lt;groupId&gt;org.mybatis&lt;/groupId&gt;  	&lt;artifac ...</div></div></div><div class="recent-post-item"><div class="post_cover left_radius"><a href="/2021/08/01/SpringMVC%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" title="SpringMVC学习笔记">     <img class="post_bg" src="https://static01.imgkr.com/temp/07cc3f2f859f40ef8733044657da8465.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="SpringMVC学习笔记"></a></div><div class="recent-post-info"><a class="article-title" href="/2021/08/01/SpringMVC%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" title="SpringMVC学习笔记">SpringMVC学习笔记</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2021-08-01T12:40:45.000Z" title="发表于 2021-08-01 20:40:45">2021-08-01</time></span></div><div class="content">1、概述在了解SpringMVC之前，我们需要知道MVC架构设计模式以及J2EE的三层架构设计，MVC模式如下图所示：

三层结构如下图所示：

SpringMVC则是基于 MVC 设计理念的 Web 框架，集成于SpringFramework中。SpringMVC也就是我们熟知的’SSM’中的’S’，它通过一套 MVC 注解，让 POJO 成为处理请求的控制器，而无须实现任何接口，并且支持REST风格URL，整体采用松散耦合、可插拔组件结构，比其他 MVC 框架更具扩展性和灵活性。
SpringMVC 基于 Servlet 规范实现，所以基于 SpringMVC 的项目，需要 Servlet 容器服务器支撑，比如常用的tomcat。
2、快速上手1）环境准备首先需要导入项目所需要的maven依赖，包括spring-web、spring-webmvc、servlet-api、jsp相关依赖、IoC相关依赖。基本环境为Spring5.1.3.RELEASE，tomcat8。
2）逻辑代码①控制器类首先需要创建一个用于分发请求的控制器类，在SpringMVC中只要给类标上@Controll ...</div></div></div><div class="recent-post-item"><div class="post_cover right_radius"><a href="/2021/07/30/Spring%E5%AD%A6%E4%B9%A0-3-AOP/" title="Spring学习(3)AOP">     <img class="post_bg" src="https://www.hualigs.cn/image/610c2015e15b8.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Spring学习(3)AOP"></a></div><div class="recent-post-info"><a class="article-title" href="/2021/07/30/Spring%E5%AD%A6%E4%B9%A0-3-AOP/" title="Spring学习(3)AOP">Spring学习(3)AOP</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2021-07-29T17:36:08.000Z" title="发表于 2021-07-30 01:36:08">2021-07-30</time></span></div><div class="content">接Spring学习(2)：https://h0ss.gitee.io/2021/07/30/Spring学习-2-IoC/
4、AOP部分4.1 AOP概述在OOP的开发中，对于一些重复的操作可以抽离成模块，这可以减少代码量，但还是无法从根本上解决代码的冗余。在这种情况下我们可以把这些重复的操作抽离成切面，通过在运行时动态代理组合进原有的对象，这就是AOP，它是对OOP的补充。
AOP即面向切面编程，实际上就是对一些方法进行业务上面的按需增强，将一些与业务逻辑无关的业务方法（如：日志打印、权限校验、数据缓存等）抽离开来作为增强器，再利用动态代理进行增强，从这我们也可以体会到AOP也有实现解耦的作用，并且AOP 可以实现组件化、可插拔式的功能扩展。
AOP的设计原理是对原有业务逻辑的横切增强，底层是运行时动态代理机制。
不同于OOP以对象为关注的核心，AOP的核心是切面。
4.2 术语①目标对象：指的是被代理对象，也就是那个需要被增强的对象；
②连接点：在Spring中，连接点指的是目标对象中的所有方法；
③切入点：指的是对目标对象进行增强的连接点，目标对象中的连接点可能很多，但需要增强 ...</div></div></div><div class="recent-post-item"><div class="post_cover left_radius"><a href="/2021/07/30/Spring%E5%AD%A6%E4%B9%A0-2-IoC/" title="Spring学习(2)IoC">     <img class="post_bg" src="https://www.hualigs.cn/image/610c2015e15b8.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Spring学习(2)IoC"></a></div><div class="recent-post-info"><a class="article-title" href="/2021/07/30/Spring%E5%AD%A6%E4%B9%A0-2-IoC/" title="Spring学习(2)IoC">Spring学习(2)IoC</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2021-07-29T17:35:55.000Z" title="发表于 2021-07-30 01:35:55">2021-07-30</time></span></div><div class="content">接Spring学习(1)：https://h0ss.gitee.io/2021/07/30/Spring学习-1-快速上手/
3、IoC部分3.1  IoC容器org.springframework.context.ApplicationContext接口代表了Spring IoC容器，它负责实例化、配置、组装bean。通过快速上手了解到，可以将类的相关声明写在配置文件中，（此外还可以使用注解驱动开发，下面会细讲），之后将资源加载到IoC容器中，通过容器去管理。而在通过IoC容器读取Bean的实例之前，需要先将IoC容器本身实例化。在web应用中通常都是通过ClassPathXmlApplicationContext在classpath下加载配置文件（基于xml配置），生成一个IoC容器：
1ApplicationContext ioc = new ClassPathXmlApplicationContext(&quot;ioc.xml&quot;);

实际上这里还可以返回成BeanFactory，这是IoC容器的基本实现，它的特点是延迟载入所有Bean；而ApplicationCo ...</div></div></div><div class="recent-post-item"><div class="post_cover right_radius"><a href="/2021/07/30/Spring%E5%AD%A6%E4%B9%A0-1-%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B/" title="Spring学习(1)快速上手">     <img class="post_bg" src="https://www.hualigs.cn/image/610c2015e15b8.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Spring学习(1)快速上手"></a></div><div class="recent-post-info"><a class="article-title" href="/2021/07/30/Spring%E5%AD%A6%E4%B9%A0-1-%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B/" title="Spring学习(1)快速上手">Spring学习(1)快速上手</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2021-07-29T17:35:37.000Z" title="发表于 2021-07-30 01:35:37">2021-07-30</time></span></div><div class="content">一、Spring Framework1、概述Spring框架是一个开源的、松耦合的、分层的、可配置的一站式企业级 Java 开发框架，它的核心是IoC（控制反转）和AOP（面向切面编程）。在Spring中，构成应用程序主干并由 Spring IoC 容器管理的对象称为bean。bean 是由IoC容器实例化，组装和以其他方式管理的对象。
IoC是一种思想，核心是将控制权转交出去，实际上指的就是本来由程序员手动创建bean的工作交由Spring进行创建，而放置和管理这些bean的就是IoC容器。程序员可以将对象的创建和相互之间的依赖关系写在配置文件中，也就是说bean及其之间的依赖关系反映在容器使用的配置元数据中，以此达到松耦合的效果。
DI即依赖注入，指的是组件以一些预先定义好的方式(如Setter 方法)接受来自于容器的资源注入。IoC也被称为是DI。

IoC is also known as dependency injection (DI).  —Spring5.1.3.RELEASE文档

AOP可以将与业务无关却被业务调用的逻辑封装起来，为应用业务做统一或特定的功能增强，能 ...</div></div></div><div class="recent-post-item"><div class="post_cover left_radius"><a href="/2021/06/16/LeetCode%E6%AF%8F%E6%97%A5%E4%B8%80%E9%A2%9806-16/" title="LeetCode每日一题06-16">     <img class="post_bg" src="https://img.yzcdn.cn/upload_files/2019/10/24/Fjj9BHxcDHPiux_bYihZe5YW4mLH.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="LeetCode每日一题06-16"></a></div><div class="recent-post-info"><a class="article-title" href="/2021/06/16/LeetCode%E6%AF%8F%E6%97%A5%E4%B8%80%E9%A2%9806-16/" title="LeetCode每日一题06-16">LeetCode每日一题06-16</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2021-06-16T13:44:22.000Z" title="发表于 2021-06-16 21:44:22">2021-06-16</time></span></div><div class="content">题目：877. 石子游戏亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行，每堆都有正整数颗石子 piles[i] 。
游戏以谁手中的石子最多来决出胜负。石子的总数是奇数，所以没有平局。
亚历克斯和李轮流进行，亚历克斯先开始。 每回合，玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止，此时手中石子最多的玩家获胜。
假设亚历克斯和李都发挥出最佳水平，当亚历克斯赢得比赛时返回 true ，当李赢得比赛时返回 false 。
示例：

输入：[5,3,4,5]输出：true解释：亚历克斯先开始，只能拿前 5 颗或后 5 颗石子 。假设他取了前 5 颗，这一行就变成了 [3,4,5] 。如果李拿走前 3 颗，那么剩下的是 [4,5]，亚历克斯拿走后 5 颗赢得 10 分。如果李拿走后 5 颗，那么剩下的是 [3,4]，亚历克斯拿走后 4 颗赢得 9 分。这表明，取前 5 颗石子对亚历克斯来说是一个胜利的举动，所以我们返回 true 。

解题思路：由于每次只能取第一个或者最后一个，因此剩下的石头堆都是连续的，也就可以看成一个区间。由于俩人都发挥出最佳水平，那么问题就 ...</div></div></div><div class="recent-post-item"><div class="post_cover right_radius"><a href="/2021/06/14/LeetCode%E6%AF%8F%E6%97%A5%E4%B8%80%E9%A2%9806-13/" title="LeetCode每日一题06-13">     <img class="post_bg" src="https://img.yzcdn.cn/upload_files/2019/10/24/Fjj9BHxcDHPiux_bYihZe5YW4mLH.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="LeetCode每日一题06-13"></a></div><div class="recent-post-info"><a class="article-title" href="/2021/06/14/LeetCode%E6%AF%8F%E6%97%A5%E4%B8%80%E9%A2%9806-13/" title="LeetCode每日一题06-13">LeetCode每日一题06-13</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2021-06-14T06:32:50.000Z" title="发表于 2021-06-14 14:32:50">2021-06-14</time></span></div><div class="content">题目：278. 第一个错误的版本你是产品经理，目前正在带领一个团队开发新的产品。不幸的是，你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的，所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, …, n]，你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例:

给定 n = 5，并且 version = 4 是第一个错误的版本。
调用 isBadVersion(3) -&gt; false调用 isBadVersion(5) -&gt; true调用 isBadVersion(4) -&gt; true
所以，4 是第一个错误的版本。 

解题思路：由于要求的是减少对API的调用，因此遍历的方法显然太拉了。由题意可知如果一个版本是错误版本，那么其后的版本均为错误版本，且在第一个错误版本之前的都是正确的版本，因此也就可以简化为一个二分查找的 ...</div></div></div><div class="recent-post-item"><div class="post_cover left_radius"><a href="/2021/06/04/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F-python/" title="正则表达式-python">     <img class="post_bg" src="https://i.loli.net/2021/09/01/4oSNuD31CVRgPQz.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="正则表达式-python"></a></div><div class="recent-post-info"><a class="article-title" href="/2021/06/04/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F-python/" title="正则表达式-python">正则表达式-python</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2021-06-03T16:25:32.000Z" title="发表于 2021-06-04 00:25:32">2021-06-04</time></span></div><div class="content">正则表达式1、正则模块python中有一个内置模块re，无需使用pip安装，直接 import re
2、主要方法1）findall(表达式, 处理字符串, 模式)特点：
会匹配出所有符合的项
模式：
①re.I 忽略大小写匹配
1234str1 = &#x27;python11C#\n11java66php&#x27;a = re.findall(&#x27;c#&#x27;, str1, re.I) # re.I 忽略大小写匹配&gt;&gt;&gt; [&#x27;C#&#x27;]

②re.S如果用.匹配可匹配所有字符包括换行符
12345str1 = &#x27;python11C#\n11java66php&#x27; # 既忽略大小写又允许匹配换行符b = re.findall(&#x27;c#.&#123;1&#125;&#x27;, str1, re.I | re.S)&gt;&gt;&gt; [&#x27;C#\n&#x27;]

2）re.sub(匹配表达式，替换的内容，操作的字符串，次数)特点：
1）替换的内容可以是一个函数也就是可以通过函数来处理匹配到的字符 ...</div></div></div><div class="recent-post-item"><div class="post_cover right_radius"><a href="/2021/05/07/MySQL%E7%9F%A5%E8%AF%86%E6%95%B4%E5%90%88/" title="MySQL入门知识整合">     <img class="post_bg" src="https://tse3-mm.cn.bing.net/th/id/OIP.47fIp5Y4IN4qyJfkBELcqwHaHq?pid=ImgDet&amp;rs=1" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="MySQL入门知识整合"></a></div><div class="recent-post-info"><a class="article-title" href="/2021/05/07/MySQL%E7%9F%A5%E8%AF%86%E6%95%B4%E5%90%88/" title="MySQL入门知识整合">MySQL入门知识整合</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2021-05-07T05:19:57.000Z" title="发表于 2021-05-07 13:19:57">2021-05-07</time></span></div><div class="content">一、SQL基本概念1、SQL（Structured Query Language）​        SQL是一种领域专用编程语言，用于管理关系数据库管理系统（RDBMS），或在关系流数据管理系统（RDSMS）中进行流处理。SQL的范围包括数据的增删改查(CRUD)、数据库模式创建和修改，以及数据访问控制。
2、DB（database）​        数据库是一个以某种有组织方式存储的数据集合，简而言之可视为电子化的文件柜——存储电子文件的处所，用户可以对文件中的资料运行新增、截取、更新、删除等操作，一个数据库由多个表(table)构成。它本质上就是一个保存有组织数据的容器。
3、DBMS（database management system）​        数据库管理系统是一种针对对象数据库，为管理数据库而设计的大型电脑软件管理系统。每种DBMS都会针对SQL进行一定程度的扩展，本文讲的是其中的MySQL的语法知识。
二、数据存储特点1、表​        在关系型数据库中，数据库表是一系列二维数组的集合，可以用来存储和表示数据对象之间的关系。每个表的命名都是唯一的，对于MySQL ...</div></div></div><nav id="pagination"><div class="pagination"><a class="extend prev" rel="prev" href="/page/2/#content-inner"><i class="fas fa-chevron-left fa-fw"></i></a><a class="page-number" href="/">1</a><a class="page-number" href="/page/2/#content-inner">2</a><span class="page-number current">3</span><a class="page-number" href="/page/4/#content-inner">4</a><a class="page-number" href="/page/5/#content-inner">5</a><a class="extend next" rel="next" href="/page/4/#content-inner"><i class="fas fa-chevron-right fa-fw"></i></a></div></nav></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="card-info-avatar is-center"><img class="avatar-img" src="/img/avatar.jpg" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/><div class="author-info__name">h0ss</div><div class="author-info__description">一个苦逼后端仔的学习记录</div></div><div class="card-info-data"><div class="card-info-data-item is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">51</div></a></div><div class="card-info-data-item is-center"><a href="/tags/"><div class="headline">标签</div><div class="length-num">14</div></a></div></div><a class="button--animated" id="card-info-btn" target="_blank" rel="noopener" href="https://gitee.com/h0ss"><i class="fab fa-github"></i><span>Gitee仓库</span></a></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn card-announcement-animation"></i><span>公告</span></div><div class="announcement_content">Java后端技术栈语雀文档：https://www.yuque.com/oliver-wdtb1/java</div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2022/11/16/%E7%BB%99%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E6%8F%90%E4%BA%86%E4%B8%AAPR/" title="给开源项目提了个PR">给开源项目提了个PR</a><time datetime="2022-11-15T17:28:40.000Z" title="发表于 2022-11-16 01:28:40">2022-11-16</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2022/09/03/%E3%80%90MySQL%E3%80%91InnoDB%E7%9A%84%E8%A1%8C%E6%A0%BC%E5%BC%8F/" title="【MySQL】InnoDB的行格式">【MySQL】InnoDB的行格式</a><time datetime="2022-09-02T18:17:38.000Z" title="发表于 2022-09-03 02:17:38">2022-09-03</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2022/08/21/%E3%80%90Debug%E3%80%91bitField-%E5%BC%95%E5%8F%91%E7%9A%84%E6%A0%88%E6%BA%A2%E5%87%BA%E6%8E%92%E9%94%99%E8%AE%B0/" title="【Debug】bitField 引发的栈溢出排错记">【Debug】bitField 引发的栈溢出排错记</a><time datetime="2022-08-20T18:10:40.000Z" title="发表于 2022-08-21 02:10:40">2022-08-21</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2022/07/16/%E3%80%90RPC%E3%80%91%E8%AF%A6%E8%A7%A3SPI%E6%9C%BA%E5%88%B6/" title="【RPC】详解SPI机制">【RPC】详解SPI机制</a><time datetime="2022-07-15T18:51:57.000Z" title="发表于 2022-07-16 02:51:57">2022-07-16</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2022/07/14/%E3%80%90Redis%E3%80%91%E9%87%8D%E8%A6%81%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%9F%BA%E7%A1%80/" title="【Redis】重要数据结构基础">【Redis】重要数据结构基础</a><time datetime="2022-07-13T17:22:08.000Z" title="发表于 2022-07-14 01:22:08">2022-07-14</time></div></div></div></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/AppCube/" style="font-size: 1.1em; color: #999">AppCube</a> <a href="/tags/JVM/" style="font-size: 1.33em; color: #99a2af">JVM</a> <a href="/tags/Java/" style="font-size: 1.5em; color: #99a9bf">Java</a> <a href="/tags/LeetCode/" style="font-size: 1.21em; color: #999ea4">LeetCode</a> <a href="/tags/Linux/" style="font-size: 1.39em; color: #99a4b4">Linux</a> <a href="/tags/MySQL/" style="font-size: 1.44em; color: #99a7ba">MySQL</a> <a href="/tags/Mybatis/" style="font-size: 1.1em; color: #999">Mybatis</a> <a href="/tags/RPC/" style="font-size: 1.27em; color: #99a0a9">RPC</a> <a href="/tags/Redis/" style="font-size: 1.27em; color: #99a0a9">Redis</a> <a href="/tags/SQL/" style="font-size: 1.1em; color: #999">SQL</a> <a href="/tags/Spring/" style="font-size: 1.33em; color: #99a2af">Spring</a> <a href="/tags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/" style="font-size: 1.1em; color: #999">正则表达式</a> <a href="/tags/%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/" style="font-size: 1.1em; color: #999">组成原理</a> <a href="/tags/%E8%AE%A1%E7%BD%91/" style="font-size: 1.16em; color: #999b9e">计网</a></div></div><div class="card-widget card-archives"><div class="item-headline"><i class="fas fa-archive"></i><span>归档</span><a class="card-more-btn" href="/archives/" title="查看更多">
    <i class="fas fa-angle-right"></i></a></div><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/11/"><span class="card-archive-list-date">十一月 2022</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/09/"><span class="card-archive-list-date">九月 2022</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/08/"><span class="card-archive-list-date">八月 2022</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/07/"><span class="card-archive-list-date">七月 2022</span><span class="card-archive-list-count">4</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/06/"><span class="card-archive-list-date">六月 2022</span><span class="card-archive-list-count">10</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/05/"><span class="card-archive-list-date">五月 2022</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/04/"><span class="card-archive-list-date">四月 2022</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/03/"><span class="card-archive-list-date">三月 2022</span><span class="card-archive-list-count">1</span></a></li></ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站资讯</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">51</div></div><div class="webinfo-item"><div class="item-name">已运行时间 :</div><div class="item-count" id="runtimeshow" data-publishDate="2021-02-14T16:00:00.000Z"></div></div><div class="webinfo-item"><div class="item-name">本站总字数 :</div><div class="item-count">129.9k</div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2022-11-15T17:31:31.795Z"></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><div class="js-pjax"></div><script defer="defer" id="fluttering_ribbon" mobile="false" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/canvas-fluttering-ribbon.min.js"></script><script id="canvas_nest" defer="defer" color="0,0,255" opacity="0.7" zIndex="-1" count="99" mobile="false" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/canvas-nest.min.js"></script><script id="click-heart" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/click-heart.min.js" async="async" mobile="false"></script><script id="click-show-text" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/click-show-text.min.js" data-mobile="false" data-text="爱国,敬业,诚信,友善,自由,平等,公正,法治,富强,民主,文明,和谐" data-fontsize="16px" data-random="false" async="async"></script></div></body></html>